package Cliente;

import Conexion.Pais;
import Conexion.SerializedObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;


/**
 * Esta clase permite crear una conexion a una direccion Ip y puertos determinados
 * y mantener dicha conexion con el servidor hasta que el cliente se desconecte
 * del sistema.
 * Contiene un objeto de la clase Cliente para enviar objetos serializados al
 * servidor.
 * contiene un variable booleana que mantiene abierto el hilo de comunicación con el
 * servidor.
 * contiene una variable que almacena el numero de partidas creadas
 *
 */
public class Emisor implements Runnable {
	    private int partidas=0;
            private Cliente C=new Cliente();
            boolean fin=false;

            /**
             * Este metodo permite crear una conexión a una Ip y puerto
             * determinados previamnte.
             * Precondición: el servidor existe en la dirección establecida en el
             * puerto definido por el usuario.
             * Postcondición: Se ha creado exitosamente la conexión al servidor y
             * puerto determinado.
             */
            public Emisor(){
                C.crerConex("127.0.0.1",2000);
	    }

            /**
             * Este metodo permite crear un hilo de ejecución que vincula un cliente
             * a una partida y espera a los jugadores vinculados a dicha partida
             * Precondición: conexion con el servidor creada previamente
             * Postcondición: El cliente pudo ejecutar a un hilo y terminarlos 
             * exitosamente de ejecución con el servidor.
             */
            public void run(){
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                int RESP=0;

                while(!fin){

                    System.out.println("\n BIENVENIDO");
                    System.out.println("1.Consultar PARTIDAS");
                    System.out.println("2.Seleccionar PARTIDA");
                    System.out.println("3.Jugar");
                    System.out.println("5.SALIR");
                    System.out.println("Digite el numero de su transaccion");
 
                    SerializedObject so1= new SerializedObject();
                    SerializedObject so2=null;
                    String temp=null;
                    try{
                        RESP=Integer.parseInt(in.readLine());   
                        switch(RESP){
                            case 1: 
                                    so1.setTipoM("1");
                                    C.enviar(so1);
                                    so2=C.recibir();
                                    System.out.println(so2.getMensaje());
                                    partidas=Integer.parseInt(so2.getMensaje());
                                    break;
                            case 2: System.out.println("Escriba el numero de la partida a suscribirse");
                                    System.out.println("Escriba un numero entre 1 y "+partidas+"");
                                    temp=in.readLine();
                                            
                                    so1.setTipoM("2");
                                    so1.setMensaje(temp);
                                    System.out.println("Escriba su nombre");
                                    temp=in.readLine();
                                    so1.setName(temp);

                                    C.enviar(so1);
                                    so2=C.recibir();
                                    System.out.println(so2.getMensaje());

                                    String[] RESP1=so2.getMensaje().split(" ");
                                    if(!RESP1[0].equals("CONECTADO(s)")){
                                        fin=true;
                                        so1.setTipoM("0");
                                        C.enviar(so1);
                                    }
                                    else{
                                        SerializedObject so3= new SerializedObject();
                                        so3.setMensaje(so1.getMensaje());
                                        so3.setTipoM("3");
                                        C.enviar(so3);
                                        Jugar();
                                    }
                                    break;
                            case 3: System.out.println("JUGAR JUGAR\n");
                                    this.Jugar();
                                    break;
                                    
                            case 4: System.out.println(temp);
                                    System.out.println("Escriba la TEMATICA a eliminar");
                                    temp=in.readLine();
                                    break;
                                    
                            case 5: System.out.println("CHAITO\n");
                                    fin=true;
                                    so1.setTipoM("0");
                                    C.enviar(so1);
                                    break;
                            default:
                                    break;
                        }
                    }
                    catch( IOException e ) {
	                e.printStackTrace();
	                }
                    catch(Exception e){
                        e.printStackTrace();
                    }
                    try {
	                Thread.sleep( (int)(Math.random() * 5) );
	            } 
	            catch( InterruptedException e ) {
	                e.printStackTrace();
	                }                    
                  }
                C.close();      
            }
            /**
             * Este metodo permite simular la seleccion de un pais en el lado del
             * cliente asi como esperar para  aquellos cliente que esten en
             * turno en un momento dado.
             * Precondición: La conexión, partida y el jugador ya esta registrado
             * una partida.
             * Postcondición:se espero cuando no se estaba en turno. Se jugo cuando
             * se le asigno el turno.
             * Se simulo correctamente la actualización de un conjunto de paises.
             */
            public void Jugar(){
                BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
                boolean todos=false;
                boolean finJuego=false;
                SerializedObject so2=null;
                
                while(!todos){
                    System.out.println("Esperando Jugadores");
                    so2=C.recibir();
                    System.out.println(so2.getTipoM());
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                        }

                    System.out.println("Alo1");
                    if(so2.getTipoM().equalsIgnoreCase("IDENTIFICAR")){
                        System.out.println("Su nombre es "+so2.getName());
                        System.out.println("Su turno es "+so2.getMensaje());
                        System.out.println("Sus oponentes son: ");
                        ArrayList<String> oponents=new ArrayList<String>();

                        oponents=(ArrayList<String>) so2.getObject();
                        if(oponents.size()==3)
                            todos=true;
                        for(int j=0;j<oponents.size();j++){
                            System.out.println(oponents.get(j));
                        }
                    }
                }

                while(!finJuego){
                    System.out.println("Esperando Jugada");
                    so2=C.recibir();
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException ex) {
                            Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                        }

                    if(so2.getTipoM().equalsIgnoreCase("ESPERAR")){
                        ArrayList<Pais> mundo=new ArrayList<Pais>();
                        mundo =(ArrayList<Pais>)so2.getObject();
                        System.out.println("ESPERAR TURNO");
                        for(int i=0;i<mundo.size();i++){
                            System.out.println(mundo.get(i).getNombre()+" "+
                                    mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                        }
                    }
                    if(so2.getTipoM().equalsIgnoreCase("JUGAR")){
                        System.out.println("TU TURNO");
                        ArrayList<Pais> mundo=new ArrayList<Pais>();
                        mundo=(ArrayList<Pais>)so2.getObject();
                        System.out.println("Estado actual del Mundo");
                        for(int i=0;i<mundo.size();i++){
                            System.out.println(mundo.get(i).getNombre()+" "+
                                    mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                        }
                        System.out.println("Escriba el nombre del pais donde desea ubicar unidades");
                        String temp=null;
                        try {
                            temp = in.readLine();
                        } catch (IOException ex) {
                            Logger.getLogger(Emisor.class.getName()).log(Level.SEVERE, null, ex);
                        }
                        for(int i=0;i<mundo.size();i++){
                            if(mundo.get(i).getNombre().equalsIgnoreCase(temp)){
                                mundo.get(i).addUnidades();
                                mundo.get(i).setJugador(so2.getName());
                            }
                        }
                        for(int i=0;i<mundo.size();i++){
                            System.out.println(mundo.get(i).getNombre()+" "+
                                    mundo.get(i).getJugador()+" "+mundo.get(i).getUnidades());
                        }
                        SerializedObject so3=new SerializedObject();
                        so3.setObject(mundo);
                        C.enviar(so3);
                    }
                }
            }

           public void Jugadores(){

           }

            

}



